package com.aaa.qy127.service.impl;

import com.aaa.qy127.dao.RoleDao;
import com.aaa.qy127.dao.StaffDao;
import com.aaa.qy127.entity.Staff;
import com.aaa.qy127.service.StaffService;
import com.aaa.qy127.util.CodeAndMsg;
import com.aaa.qy127.util.Result;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@Service("StaffServiceImpl")
public class StaffServiceImpl implements StaffService {

    @Resource(name = "StaffDaoImpl")
    private StaffDao staffDao;

    @Resource(name = "roleDaoImpl")
    private RoleDao roleDao;

    /**
     * 通过 StaffId 和 password 获取 staff 的信息
     * 如果 staff 中没有查询到值 就返回一个code“1002” 表示 用户名或者密码错误
     * 如果 staff 查到了值 但是 其中的status 的值为0（离职状态） 就返回一个code“1003” 表示 已经离职
     * 如果 staff 查到了值 并 查到的类型是1（在职） 就返回一个code“1004” 表示 权限不够
     * 否则 返回一个code “1001” 表示可以登录
     * @param staffId
     * @param password
     * @return
     */
    @Override
    public CodeAndMsg getCodeAndMsg(String staffId, String password,HttpServletRequest request){

        Staff staff = staffDao.getOneStaffByStaffIdAndPassword(staffId, password);

        CodeAndMsg codeAndMsg = new CodeAndMsg();
        if (staff == null){
            codeAndMsg.setCode(1002);
            codeAndMsg.setMsg("用户名或者密码错误");
        }else if (staff.getStatus() == 0){
            codeAndMsg.setCode(1003);
            codeAndMsg.setMsg("你已离职");
        }else if (staff.getRoleId() == null){
            codeAndMsg.setCode(1004);
            codeAndMsg.setMsg("你的权限不够");
        }else {
            int oneStatusByRid = roleDao.getOneStatusByRid(staff.getRoleId());
            if (oneStatusByRid != 1){
                codeAndMsg.setCode(1004);
                codeAndMsg.setMsg("你的权限不够");
            }else {
                request.getSession().setAttribute("staff",staff);
                codeAndMsg.setCode(1001);
            }
        }

        return codeAndMsg;
    }

    /**
     * 查询 所有的 员工信息 的业务
     * @param staff
     * @return
     */
    @Override
    public Result selStaff(Staff staff){
        List<Map<String, Object>> allStaff = staffDao.getAllStaff(staff);
        int count = staffDao.getAllCount(staff);
        Result result = new Result(count, allStaff);
        return result;
    }

    /**
     * 修改 状态的业务
     * 如果修改成功 返回 “1001”
     * 如果修改失败  返回 “1002”
     * @param id
     * @param status
     * @return
     */
    @Override
    public String updStatus(Integer id,Integer status ){
        int i = staffDao.updateOneStatus(id, status);
        if (i>0){
            return "1001";
        }else {
            return "1002";
        }
    }

    /**
     * 新增或修改 的业务
     * 根据身份证号，查询，判断，如果有相同的身份证号的员工，则不能添加或修改
     * 否则，可以添加或者修改
     * 添加时 如果角色时管理员， 并且已经有管理员了，就不能在添加
     * 如果 修改 或 新增 成功 返回 “1001”
     * 如果 修改 或 新增 失败 返回 “1002”
     * @param staff
     * @return
     */
    @Override
    public CodeAndMsg updAndInsStaff(Staff staff){
        Integer id = staff.getId();
        List<Map<String, Object>> staffByIdCard = staffDao.getStaffByIdCard(staff);
        List<Map<String, Object>> oneStaffByIdAndIdCard = staffDao.getOneStaffByIdAndIdCard(staff);
        int countGroupBYRoleId = staffDao.getCountGroupBYRoleId();
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        int i = 0;
        if (id == null){//通过id 判断是 新增 还是修改
            if (staffByIdCard ==null){//判断是否有 身份证 相同的
                if (countGroupBYRoleId == 1){ //判断是否已有管理员
                    if (staff.getRoleId() == 1){  //判断 这次修改的内容是否包括管理员
                        codeAndMsg.setCode(1004);
                        codeAndMsg.setMsg("只能有一个管理员");
                    }else {
                        i = staffDao.insertOneStaff(staff);
                        if (i>0){
                            codeAndMsg.setCode(1001);
                            codeAndMsg.setMsg("添加成功");
                        }else {
                            codeAndMsg.setCode(1002);
                            codeAndMsg.setMsg("添加失败");
                        }
                    }
                }else {
                    i = staffDao.insertOneStaff(staff);
                    if (i>0){
                        codeAndMsg.setCode(1001);
                        codeAndMsg.setMsg("添加成功");
                    }else {
                        codeAndMsg.setCode(1002);
                        codeAndMsg.setMsg("添加失败");
                    }
                }
            }else {
                codeAndMsg.setCode(1003);
                codeAndMsg.setMsg("已存在，不能添加");
            }
        }else { //修改
            if (staffByIdCard ==null){//判断是否有 身份证 相同的
                if (countGroupBYRoleId == 1){ //判断是否已有管理元
                    if (staff.getRoleId() == 1){  //判断 这次修改的是否式管理员
                        codeAndMsg.setCode(1004);
                        codeAndMsg.setMsg("只能有一个管理员");
                    }else {
                        i = staffDao.updateOneStaff(staff);
                        if (i>0){
                            codeAndMsg.setCode(1001);
                            codeAndMsg.setMsg("修改成功");
                        }else {
                            codeAndMsg.setCode(1002);
                            codeAndMsg.setMsg("修改失败");
                        }
                    }
                }else {
                    i = staffDao.updateOneStaff(staff);
                    if (i>0){
                        codeAndMsg.setCode(1001);
                        codeAndMsg.setMsg("修改成功");
                    }else {
                        codeAndMsg.setCode(1002);
                        codeAndMsg.setMsg("修改失败");
                    }
                }
            }else {
                if (oneStaffByIdAndIdCard == null){
                    codeAndMsg.setCode(1003);
                    codeAndMsg.setMsg("已存在，不能修改");
                }else {
                    if (countGroupBYRoleId == 1){ //判断是否已有管理元
                        if (staff.getRoleId() == 1){  //判断 这次修改的是否式管理员
                            codeAndMsg.setCode(1004);
                            codeAndMsg.setMsg("只能有一个管理员");
                        }else {
                            i = staffDao.updateOneStaff(staff);
                            if (i>0){
                                codeAndMsg.setCode(1001);
                                codeAndMsg.setMsg("修改成功");
                            }else {
                                codeAndMsg.setCode(1002);
                                codeAndMsg.setMsg("修改失败");
                            }
                        }
                    }else {
                        i = staffDao.updateOneStaff(staff);
                        if (i>0){
                            codeAndMsg.setCode(1001);
                            codeAndMsg.setMsg("修改成功");
                        }else {
                            codeAndMsg.setCode(1002);
                            codeAndMsg.setMsg("修改失败");
                        }
                    }
                }
            }
        }
        return codeAndMsg;
    }

    /**
     * 返回 staffId 的最大值 的 业务
     * @return
     */
    @Override
    public int getStaffId(){
        int max = staffDao.getMax();
        return max;
    }

    @Override
    public int updatePassword(Integer staffId, String password) {
        int i = staffDao.updatePassword(staffId, password);
        return i;
    }

    /**
     * 获取当前登录人的信息
     * @param request
     * @return
     */
    @Override
    public List<Map<String, Object>> getNowLoginStaffInformation(HttpServletRequest request) {
        List<Map<String, Object>> nowLoginStaff = staffDao.getNowLoginStaffInformation(request);
        //System.out.println(nowLoginStaff);
        return nowLoginStaff;
    }

    /**
     * 更新当前登录人的手机号和地址
     * @param staff
     * @param request
     * @return
     */
    @Override
    public int updateStaffPhoneAndAddress(Staff staff, HttpServletRequest request) {
        int i = staffDao.updateStaffPhoneAndAddress(staff, request);
        return i;
    }


    /**
     * 根据当前登录人的id更新头像的url
     * @param request
     * @param file
     * @return
     */
    @Override
    public Map imgUpload(HttpServletRequest request, MultipartFile file) {
        Map map = staffDao.imgUpload(request, file);
        //System.out.println("imgUpload1:"+request.getSession().getAttribute("staff"));
        //更新session
        Staff staff1 = (Staff)request.getSession().getAttribute("staff");
        Staff staff = staffDao.getOneStaffByStaffIdAndPassword(staff1.getStaffId().toString(), staff1.getPassword());
        request.getSession().setAttribute("staff",staff);
        //System.out.println("imgUpload2:"+request.getSession().getAttribute("staff"));
        return map;
    }

}
